package com.javaai.project.config;

import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.loader.FileSystemDocumentLoader;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.memory.chat.ChatMemoryProvider;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.rag.content.retriever.ContentRetriever;
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
import dev.langchain4j.store.embedding.EmbeddingStoreIngestor;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

@Configuration
public class DoctorAssistantConfig {

    @Autowired
    private MongoChatMemoryStore mongoChatMemoryStore;

    // 注入EmbeddingModel以支持文档向量化
    @Autowired
    private EmbeddingModel embeddingModel;

    @Bean
    public ChatMemoryProvider chatMemoryProviderDoctor() {
        return memoryId -> MessageWindowChatMemory.builder()
                .id(memoryId)
                .maxMessages(10)
                .chatMemoryStore(mongoChatMemoryStore)  // 聊天记录持久化配置
                .build();
    }

    // 配置向量存储
    @Bean
    ContentRetriever contentRetrieverDoctor() {
        try {
            //使用FileSystemDocumentLoader读取指定目录下的知识库文档
            //并使用默认的文档解析器对文档进行解析  (加载外部的知识库)
            Document document1 = FileSystemDocumentLoader.loadDocument("C:\\Users\\18216\\Desktop\\DocterAi\\Ai\\src\\main\\resources\\医院信息.md");
            Document document2 = FileSystemDocumentLoader.loadDocument("C:\\Users\\18216\\Desktop\\DocterAi\\Ai\\src\\main\\resources\\科室信息.md");
            Document document3 = FileSystemDocumentLoader.loadDocument("C:\\Users\\18216\\Desktop\\DocterAi\\Ai\\src\\main\\resources\\神经内科.md");
            List<Document> documents = Arrays.asList(document1, document2, document3);
            
            //使用内存向量存储
            InMemoryEmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();
            
            // 修复：使用EmbeddingStoreIngestor的构建器模式来指定embeddingModel
            // 这样文档和查询都会使用text-embedding-v3（1024维）模型，避免维度不匹配
            EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder()
                    .embeddingModel(embeddingModel)
                    .embeddingStore(embeddingStore)
                    .build();
            
            // 执行文档向量化
            ingestor.ingest(documents);
            
            //从嵌入存储（EmbeddingStore）里检索和查询内容相关的信息
            return EmbeddingStoreContentRetriever.builder()
                    .embeddingStore(embeddingStore)
                    .embeddingModel(embeddingModel)
                    .maxResults(1)
                    .minScore(0.8)
                    .build();
        } catch (Exception e) {
            // 添加异常处理，避免启动时因文档加载失败导致整个应用崩溃
            System.err.println("加载知识库文档失败: " + e.getMessage());
            // 修复：为lambda表达式添加参数以符合ContentRetriever接口的方法签名
            return query -> Collections.emptyList();
        }
    }

    // 移除了重复的contentRetrieverDoctorPincone Bean定义
    // 这个Bean现在只在EmbeddingStoreConfig.java中定义一次
}